import axios from 'axios';
import qs from 'qs';
import { useCommonStore } from '@/store/common';
import { message } from 'ant-design-vue';

const commonStore = useCommonStore();

axios.defaults.baseURL = process.env.VUE_APP_BASE_API;
axios.defaults.withCredentials = true;

// 添加请求拦截器
axios.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    message.error('系统错误，请联系管理员');
    return Promise.reject(error);
  }
);
// 添加响应拦截器
axios.interceptors.response.use(
  function (response) {
    if (!response.data.success) {
      message.error(response.data.messages[0] || response.data.error || '接口异常，请联系管理员');
    }
    return response;
  },
  function (error) {
    // 对响应错误做点什么
    message.error('网络错误，请联系管理员');
    return Promise.reject(error);
  }
);

/**
 * post请求
 * @param {Object} params 请求参数
 * @param {string} params.url 请求url
 * @param {Object} params.data 请求体
 * @param {boolean} params.showLoading 是否显示loading，默认为false不显示
 * @returns {Promise<Object>}
 */
export const post = ({ url, data = {}, showLoading = false }) => {
  return new Promise((resolve) => {
    if (showLoading) {
      commonStore.loadingCount++;
    }
    axios
      .post(url, qs.stringify(data))
      .then((response) => {
        if (response.data.success) {
          resolve(response.data);
        }
      })
      .catch(() => {})
      .finally(() => {
        if (showLoading) {
          commonStore.loadingCount--;
        }
      });
  });
};

/**
 * get请求
 * @param {Object} params 请求参数
 * @param {string} params.url 请求url
 * @param {Object} params.data 请求体
 * @param {boolean} params.showLoading 是否显示loading，默认为false不显示
 * @returns {Promise<Object>}
 */
export const get = ({ url, data = {}, showLoading = false }) => {
  return new Promise((resolve) => {
    if (showLoading) {
      commonStore.loadingCount++;
    }
    axios
      .get(url, { params: data })
      .then((response) => {
        if (response.data.success) {
          resolve(response.data);
        }
      })
      .catch(() => {})
      .finally(() => {
        if (showLoading) {
          commonStore.loadingCount--;
        }
      });
  });
};

/**
 * 文件上传
 * @param {Object} params 请求参数
 * @param {string} params.url 请求url
 * @param {Object} params.data 请求体，传入普通json对象，函数中会自动new一个FormData并append参数
 * @param {boolean} params.showLoading 是否显示loading，默认为false不显示
 * @returns {Promise<Object>}
 */
export const formData = ({ url, data = {}, showLoading = true }) => {
  let formData = new FormData();
  Object.keys(data).forEach((v) => {
    formData.append(v, data[v]);
  });
  return new Promise((resolve) => {
    if (showLoading) {
      commonStore.loadingCount++;
    }
    axios
      .post(url, formData)
      .then((response) => {
        if (response.data.success) {
          resolve(response.data);
        }
      })
      .catch(() => {})
      .finally(() => {
        if (showLoading) {
          commonStore.loadingCount--;
        }
      });
  });
};
